好像有那麼一點感覺了,但感覺又太簡單,沒有隔壁鱈魚說的那麼誇張,應該需要更難一點的挑戰,畢竟我可是遇強則強,遇弱則弱的特殊體質。
#挽回愛情的第五天
useVModel
APIuseVModel
是一個用於簡化 v-model
雙向綁定的 Vue 工具函數。它允許開發者更靈活地處理 props
和 emit
事件的綁定,並可透過 passive
模式來手動管理 props
的變更與資料流。當 passive: false
時,useVModel
會依賴 Vue 的內建雙向綁定機制;而當 passive: true
時,則會使用 watch
來手動處理資料同步。
名稱 | 類型 | 說明 |
---|---|---|
props |
P extends object |
父層組件傳入的 props 對象 |
key |
K extends keyof P |
用來指定 props 中的鍵名稱,默認為 modelValue 。 |
emit |
(name: string, ...args: any[]) => void |
emit 函數,用於向父層傳遞更新事件。 |
options |
UseVModelOptions<P[K], Passive> |
可選配置參數,用於調整綁定行為,具體選項參考下方詳細描述。 |
名稱 | 類型 | 說明 | 預設值 |
---|---|---|---|
passive |
boolean |
控制是否使用手動模式 (true ) 或 Vue 自動模式 (false ) 來同步 props 和 emit 的資料。 |
false |
eventName |
string |
自定義 emit 事件名稱,當不使用默認的 v-model 綁定時,設定此名稱覆蓋默認的事件名稱。 |
undefined |
deep |
boolean |
當 passive: true 時,可啟用深層監聽以監控深層嵌套的物件變化。 |
false |
defaultValue |
P[K] |
在沒有傳入 props 值時,設定此值作為默認值。 |
undefined |
clone |
boolean | (val: P[K]) => P[K] |
是否深度拷貝 props 中的資料,防止資料直接改動影響父層,或自定義複製邏輯。 |
false |
shouldEmit |
(v: P[K]) => boolean |
當 passive: true 時,允許自定義條件來決定是否發送 emit 事件。例如表單驗證通過才允許發送。 |
undefined |
passive: false
時無法使用的選項當 passive: false
時,useVModel
會使用 Vue 自動的雙向綁定機制,某些選項將不會生效或無法使用:
deep
:
passive: true
下可用,當使用 Vue 自動綁定時,無法監聽深層嵌套物件的變化。clone
:
props
上,無法使用深拷貝或自定義複製邏輯來隔離資料。shouldEmit
:
shouldEmit
只在手動同步模式 (passive: true
) 下可用,控制是否發送 emit
事件。在 passive: false
時,emit
事件會自動觸發,無法進行條件判斷。useVModel
返回一個 ref
或 computed
對象,用於與 props
和 emit
事件進行綁定:
passive: false
時:返回一個 computed
,自動進行雙向綁定,透過 Vue 的內建 v-model
機制處理資料變更。passive: true
時:返回一個 ref
,並使用手動監聽 props
的方式來控制綁定邏輯。passive: false
的簡單雙向綁定<template>
<input v-model="value" />
</template>
<script setup>
import { useVModel } from '@vueuse/core'
const props = defineProps({
modelValue: String,
})
const emit = defineEmits(['update:modelValue'])
// 使用 Vue 內建的 v-model 機制
const value = useVModel(props, 'modelValue', emit, { passive: false })
</script>
passive: true
進行自定義雙向綁定和驗證<template>
<input v-model="value" placeholder="輸入數字 (必須大於 10)" />
</template>
<script setup>
import { useVModel } from '@vueuse/core'
const props = defineProps({
numberValue: Number,
})
const emit = defineEmits(['update:numberValue'])
// 使用 passive: true 手動控制資料同步,並添加驗證邏輯
const value = useVModel(props, 'numberValue', emit, {
passive: true,
shouldEmit: (newValue) => newValue > 10, // 僅當值大於 10 時才觸發更新
})
</script>
如果有不懂或是有寫錯的可以留言讓我知道喔